class ApplicationController < ActionController::API
  before_action :authorized

  # 遇到没见过的函数，参考jwt的文档：
  # https://github.com/jwt/ruby-jwt/blob/master/README.md

  # 编码token
  def encode_token(payload)
    # payload是用于编码的内容是一个json对象
    # 第二个参数是secret key，用于加密，可以随便取，不能让服务器以外的知道
    JWT.encode(payload, 's3cr3t')
  end

  # 提取请求头中的Authorization字段
  def auth_header
    request.headers['Authorization'] # 请求头字段例子：{ 'Authorization': 'Bearer <token>' }
  end

  # 对token进行解码
  def decoded_token
    if auth_header
      # 从请求头的Authorization字段中提取token
      token = auth_header.split(' ')[1]
      # 请求头字段例子: { 'Authorization': 'Bearer <token>' }
      # 由前端设置，后端不用管，按照这个步骤提取就行
      begin
        # 用前端传来的token解码，成功则返回一个数组，第一个元素是包含用户信息的对象
        JWT.decode(token, 's3cr3t', true, alogrithm: 'HS256')
      rescue JWT::DecodeError
        # 解码失败返回nil
        nil
      end
    end
  end

  # 返回一个登录的用户
  def logged_in_user
    if decoded_token # token解码成功返回用户对象，第一个元素是payload对象
      user_id = decoded_token[0]['user_id']
      @user = User.find_by(id: user_id)
    end
  end

  # 取布尔值
  def logged_in?
    !!logged_in_user
  end

  # 判断用户是否已经登录
  def authorized
    # 没有登录直接向客户端返回错误json信息，成功向调用者返回true
    render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
  end
end
